package com.yanxu.design01_singleton.destroy.reflection_destory;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025/4/14-2025
 * @Description: 这里用一句话描述这个类的作用
 */
public class LazyInstance_Fixed {

    private static volatile LazyInstance_Fixed lazyInstance = null;

    private LazyInstance_Fixed() {
        /*
         * 反射防御增强代码! 但是真的能防止的住吗?
         * 是防止补不住的。因为此时是 懒汉模式。
         * 懒汉模式 单例对象并不是随着类加载而创建的。
         * 情况1：A 线程正常使用 getInstance() 获取单例对象。
         *    然后 B 线程才使用反射进行创建，此时， lazyInstance 已经不为null, 因此防止反射工具是可以的。
         *
         * 但是，情况B
         *     线程1 直接使用反射创建。此时 lazyInstance==null ,反射创建就成功了
         *
         * */
        if (lazyInstance != null) {
            throw new RuntimeException("LazyInstance not allow reflection create!!!");
        }
    }

    public static LazyInstance_Fixed getInstance() {
        if (lazyInstance == null) {
            synchronized (LazyInstance_Fixed.class) {
                if (lazyInstance != null) {
                    lazyInstance = new LazyInstance_Fixed();
                }
            }
        }
        return lazyInstance;
    }
}